import { BrowserWindow } from 'electron'
import icon from '@build/icon.png?asset'
import { is } from '@electron-toolkit/utils'
import {join} from 'path'

export default class MainFrame {
  #mainWindow
  #width = 900
  #height = 670
  #isReady = false

  create() {
    // 创建浏览器窗口。
    this.#mainWindow = new BrowserWindow({
      width: this.#width,
      height: this.#height,
      show: false,
      frame: false,
      resizable: false,
      maximizable: false,
      autoHideMenuBar: true,
      icon,
      webPreferences: {
        preload: join(__dirname, '../preload/index.js')
      }
    })

    //
    this.#mainWindow.webContents.openDevTools()

    this.#mainWindow.on('ready-to-show', () => {
      console.log('ready-to-show')
      this.#isReady = true
    })

    // HMR for renderer base on electron-vite cli.
    // 根据 electron-vite cli 进行渲染器的 HMR。
    // 根据环境变量加载远程 URL 进行开发，或者加载本地 HTML 文件进行生产。
    if (is.dev && process.env['ELECTRON_RENDERER_URL']) {
      this.#mainWindow.loadURL(process.env['ELECTRON_RENDERER_URL'])
    } else {
      this.#mainWindow.loadFile(join(__dirname, '../renderer/index.html'))
    }
  }

  isReady(){
    return this.#isReady
  }

  show(){
    this.#mainWindow.show()
  }

  hide() {
    this.#mainWindow.hide()
  }

  destroy(){
    this.#mainWindow.close()
    this.#mainWindow.destroy()
  }

  //设置用户是否可以手动最大化窗口。 在Linux上不起作用。
  setMaximizable(flag) {
    this.#mainWindow.setMaximizable(flag)
  }

  //设置用户是否可以手动调整窗口大小。
  setResizable(flag) {
    this.#mainWindow.setResizable(flag)
  }

  //设置窗口最小化的 width 和height.
  setMinimumSize(width, height){
    this.#mainWindow.setMinimumSize(width, height)
  }

  //调整窗口的width和 height. 如果 width 或 height 低于任何设定的最小尺寸约束，窗口将对齐到约束的最小尺寸。
  setSize(width, height) {
    this.#mainWindow.setSize(width, height)
  }

  //将窗口移动到 x 和 y。
  setPosition(x, y){
    this.#mainWindow.setPosition(x, y)
  }

  reset(){
    this.setResizable(false)
    this.setMaximizable(false)
    this.setMinimumSize(this.#width, this.#height)
    this.setSize(this.#width, this.#height)
  }

  //最小化
  minimize(){
    this.#mainWindow.minimize()
  }

  getSize(){
    return this.#mainWindow.getSize()
  }
}
